home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0257 / demo.exe / MQUEUE.DEM < prev    next >
Text File  |  1992-02-16  |  11KB  |  355 lines

  1. ; ----------------------------
  2. ; MQUEUE.DEM   - Demoprogramm für die Routinen aus MQUEUE.LIB
  3. ;                (für den A86)
  4. ;
  5. ;                (c) Bernd Schemmer 1992
  6. ;                Letzter Update: 15.02.1992
  7. ;
  8. ; Übersetzen:
  9. ;  A86 MQUEUE.DEM DEMOS.INC TO MQUEUE.COM
  10. ;
  11. ; Hinweis: Die Environment-Variable 'A86' muß den Dateinamen 'MACROS.MAC'
  12. ;          enthalten und die .LIB-Dateien müssen über die Datei A86.LIB
  13. ;          erreichbar sein.
  14. ;
  15. ; ---------------------------
  16.  
  17.          jmp start
  18.  
  19. ; ----------------------------
  20.                               ; Meldungen und Fehlermeldungen
  21. logo  db CR,LF
  22.       db 'MQUEUE.DEM  - Demoprogramm für die Routinen aus MQUEUE.LIB' ,CR,LF
  23.       db '----------------------------------------------------------',CR,LF
  24.       db CR,LF
  25. GETLENGTH logo
  26.                               ; Meldungen
  27. MakeMsg InitMsg,        '--- Richte die Queue ein ...'
  28. MakeMsg FuelleQueue,    '--- Fülle die Queue ...'
  29. MakeMsg LeereQueue,     '--- Leere die Queue  ...'
  30.  
  31.                               ; Fehlermeldungen
  32. MakeMsg MemoryError,    '*** Zuwenig freier Speicher.'
  33.  
  34. MsgString db 255 dup 0        ; Puffer für die Meldungen
  35.  
  36. ; ----------------------------
  37. start:
  38.          call ShowLogo        ; Logo ausgeben und Speicherblock verkleinern
  39.  
  40.          Write_String InitMsg
  41.  
  42.          mov bx,0100h         ; neuen Speicherblock für die Queue
  43.          mov ah,048h          ; anfordern
  44.          int 021h
  45.          jnc >l1
  46.  
  47.          mov ah,048h          ; nehmen wir was wir kriegen können
  48.          int 021h
  49.          jnc >l1
  50. l2:
  51.                               ; Fehler, zuwenig Speicher
  52.          Write_String MemoryError
  53.          jmp ErrorEnde
  54. l1:
  55.          mov MQueueSeg,ax     ; Segment der Queue sichern
  56.          mov es,ax            ; ES = Segment der Queue
  57.  
  58.          shl bx,1             ; Größe in Byte umrechnen
  59.          shl bx,1
  60.          shl bx,1
  61.          shl bx,1
  62.          mov cx,bx            ; CX = Größe der Queue
  63.  
  64.          call InitMQueue      ; Queue initialisieren
  65.          call CheckMQueueError
  66.          IF c jmp ErrorEnde1
  67.  
  68.                               ; Daten der Queue ausgeben
  69.          call GetMQueueStatistik
  70.          call CheckMQueueError
  71.          IF c jmp ErrorEnde1
  72.          call ShowHeader
  73.  
  74.          Write_String FuelleQueue
  75.  
  76.                               ; Dummyblock belegen
  77.                               ; nur zu Demo-Zwecken
  78.          mov si,offset MsgString
  79.          mov cx,111xD
  80.          call WriteMQueue
  81.          call CheckMQueueError
  82.          IF c jmp ErrorEnde1
  83.                               ; und wieder freigeben
  84.          call ReadMQueue
  85.          call CheckMQueueError
  86.          IF c jmp ErrorEnde1
  87.  
  88.                               ; Queue füllen
  89. l00:
  90.          call MakeMessage
  91.          call WriteMQueue
  92.          jnc l00              ; CF = 0 ->> weitere Meldungen möglich
  93.  
  94.                               ; Fehler
  95.          cmp ax,MQueueIsFull
  96.          je >l1               ; 'normaler' Fehler, Queue ist voll
  97.          stc
  98.          call CheckMQueueError
  99.          IF c jmp ErrorEnde1
  100.  
  101. l1:
  102.                               ; Daten der Queue ausgeben
  103.          call GetMQueueStatistik
  104.          call CheckMQueueError
  105.          IF c jmp ErrorEnde1
  106.          call ShowHeader
  107.  
  108.          Write_String LeereQueue
  109.  
  110.                               ; und nun Queue wieder leeren
  111.          mov es,MQueueSeg
  112. l00:
  113.          mov si,offset MsgString
  114.          mov cx,255
  115.  
  116.          push es,cx           ; Puffer löschen
  117.          mov di,si
  118.          mov es,cs
  119.          mov al,0
  120.          rep stosb
  121.          pop cx,es
  122.  
  123.          call ReadMQueue
  124.          jnc >l1              ; Meldung gelesen
  125.  
  126.          cmp ax,MQueueIsEmpty ; Fehler
  127.          je Ende              ; 'normaler' Fehler, Queue ist leer
  128.          stc
  129.          call CheckMQueueError
  130.          jc ErrorEnde1
  131. l1:
  132.          call ShowMessage     ; Meldung ausgeben
  133.          jmp l00              ; und nächste Meldung lesen
  134.  
  135. ; ------------------
  136.  
  137. ErrorEnde1:
  138.                               ; Fehlerausgang
  139.                               ; DX = Offset der Meldung
  140.                               ; CX = Länge der Meldung
  141.          call OutputMsg
  142.  
  143. ErrorEnde:
  144.          mov al,0FFh
  145. Ende:
  146.          EndProcess
  147.  
  148. ; ----------------------------
  149. ; ShowMessage
  150. ;
  151. ; Funktion: Ausgabe des Inhaltes einer Meldung
  152. ;
  153. ; Eingabe:  DS:SI -> Meldung aus der Queue
  154. ;           CX = Länge der Meldung
  155. ;
  156. ; Funktion: Ausgabe einer Meludng
  157. ;
  158. MessageString  db
  159. M1             db '_____. Meldung, Int-1Ah-Zähler: '
  160. M2             db '________h, Länge: '
  161. M3             db '___, (interner Zähler: '
  162. M30            db '_____)',CR,LF
  163. GETLENGTH MessageString
  164.  
  165. OMessageCounter dw 0          ; Zähler für die ausgegebenen Meldungen
  166.  
  167. ShowMessage:
  168.          push es
  169.          mov es,cs
  170.  
  171.          inc OMessageCounter
  172.          mov ax,OMessageCounter
  173.          mov di,offset m1
  174.          call Konvert_AX_To_Dezstring
  175.  
  176.          mov al,cl
  177.          mov di,offset m3
  178.          call Konvert_AL_To_Dezstring
  179.  
  180.          mov di,offset m2
  181.          or cl,cl
  182.          jnz >l1
  183.                               ; leere Meldung
  184.          mov ax,'??'
  185.          mov cx,4
  186.          rep stosw
  187.          mov di,offset M30
  188.          stosw
  189.          stosw
  190.          stosb
  191.          jmp >l2
  192. l1:
  193.          lodsw
  194.          call Konvert_AX_To_Hexstring
  195.          lodsw
  196.          call Konvert_AX_To_Hexstring
  197.          lodsw
  198.          mov di,offset M30
  199.          call Konvert_AX_TO_Dezstring
  200. l2:
  201.          Write_String MessageString
  202.          pop es
  203.          ret
  204.  
  205. ; ----------------------------
  206. ; ShowHeader
  207. ;
  208. ; Funktion: Ausgabe der globalen Daten der Queue
  209. ;
  210. ; Eingabe:  AX, DX und CX wie von der Routine GetMQueueStatistk geliefert
  211. ;
  212. HeaderMsg db 'Daten der Queue: '
  213.           db 'Gesamtspeicher: '
  214. m4        db '_____, freier Speicher '
  215. m5        db '_____, '
  216.           db CR,LF
  217.           db '                 '
  218. m6        db '_____ Meldungen in der Queue',CR,LF
  219. GETLENGTH HeaderMsg
  220.  
  221. ShowHeader:
  222.          push es
  223.          mov es,cs
  224.  
  225.          mov di,offset m6
  226.          call Konvert_AX_To_Dezstring
  227.  
  228.          mov di,offset m4
  229.          mov ax,dx
  230.          call Konvert_AX_To_Dezstring
  231.  
  232.          mov di,offset m5
  233.          mov ax,cx
  234.          call Konvert_AX_To_Dezstring
  235.  
  236.          Write_String HeaderMsg
  237.  
  238.          pop es
  239.          ret
  240.  
  241. ; ----------------------------
  242. ; MakeMessage
  243. ;
  244. ; Funktion: Erzeugt eine Meldung
  245. ;           (zwischen 40 und 80 Byte lang, wobei immer nur die
  246. ;            ersten 6 Byte mit Daten belegt sind)
  247. ;
  248. ; Ausgabe:  DS:SI -> Meldung
  249. ;           CX = Länge der Meldung
  250. ;
  251. MessageCounter dw 0           ; Zähler der Meldungen
  252.  
  253. LastMessageL   db 40          ; Hilfsvariable für die Länge der Meldungen
  254. LastLowWord    dw 0           ; -"-
  255.  
  256. MakeMessage:
  257.  
  258.          mov ah,0             ; Zeitzähler ermitteln
  259.          int 01Ah
  260.          cmp LastLowWord,dx
  261.          je >l1
  262.          mov lastLowWord,dx
  263.                               ; Meldung mit 0 Byte Länge erzeugen
  264.          mov cx,0
  265.          mov si,offset MsgString
  266.          ret
  267. l1:
  268.          mov si,offset MsgString
  269.          mov [si],cx
  270.          mov [si+2],dx
  271.  
  272.          mov ax,MessageCounter
  273.          mov [si+4],ax
  274.          inc MessageCounter
  275.  
  276.          mov cl,LastMessageL
  277.          add cl,7
  278.          cmp cl,80
  279.          if ae mov cl,40
  280.          mov LastMessageL,cl
  281.  
  282.          xor ch,ch
  283.          ret
  284.  
  285. ; ----------------------------
  286. ; CheckMQueueError
  287. ;
  288. ; Funktion: Ermitteln der zu einer Fehlernummer der Routinen für die
  289. ;           Verwaltung der Queue gehörenden Fehlermeldung
  290. ;
  291. ; Eingabe:  AX = Fehlercode der Routine
  292. ;           CF = CF der Routine
  293. ;
  294. ; Ausgabe:  CF = 0 ->> kein Fehler
  295. ;                      kein Register verändert
  296. ;           CF = 1 ->> Fehler
  297. ;                      DX = Offset der Fehlermeldung
  298. ;                      CX = Länge der Fehlermeldung
  299. ;                      AX unverändert
  300. ;
  301.  
  302.                               ; Fehlermeldungen
  303.                               ; ---------------
  304. MQueueErrorMsg1 db '*** Keine Meldung in der Queue!'
  305. MQueueErrorMsg2 db '*** Nicht mehr genügend freier Speicher in der Queue!'
  306. MQueueErrorMsg3 db '*** Falsche Größe für die Queue angegeben!'
  307. MQueueErrorMsg4 db '*** Puffer ist für die nächste Meldung zu klein!'
  308. MQueueErrorMsg5 db '*** Angegebene Meldung ist zu lang!'
  309. MQueueErrorMsg6 db '*** Gleichzeitiger Zugriff von mehreren Routinen nicht erlaubt!'
  310. MQueueErrorMsgU db '*** Unbekannter Fehlercode!'
  311. MQueueErrorMsgL db 0       ; Dummy-Eintrag
  312.  
  313.                      ; Tabelle der Fehlernummern und Fehlermeldungen
  314.                      ;
  315.                      ; Fehlernummer          Offset der Fehlermeldung
  316.                      ; -----------------------------------------------
  317.    MQueueErrorTable dw MQueueIsEmpty       , Offset    MQueueErrorMsg1
  318.                     dw MQueueIsFull        , Offset    MQueueErrorMsg2
  319.                     dw MQueueLengthError   , Offset    MQueueErrorMsg3
  320.                     dw MQueueBufferError   , Offset    MQueueErrorMsg4
  321.                     dw MQueueMessageError  , Offset    MQueueErrorMsg5
  322.                     dw MQueueAktivError    , Offset    MQueueErrorMsg6
  323.                               ; Eintrag für unbekannte Fehlercodes
  324.    MQueueUnknownErr dw 0                   , Offset    MQueueErrorMsgU
  325.                               ; Eintrag für die Ermittlung der Länge
  326.                               ; der letzten Fehlermeldung
  327.                     dw 0                   , Offset    MQueueErrorMsgL
  328.  
  329. CheckMQueueError:
  330.          jnc ret              ; CF = 0 ->> kein Fehler aufgetreten
  331.  
  332.          push si,ds,ax        ; CF = 1 ->> Fehler aufgetreten,
  333.                               ;            Offset der Fehlermeldung ermitteln
  334.          mov ds,cs            ; DS = CS
  335.          mov si,offset MQueueErrorTable
  336.                               ; DS:SI -> Fehlertabelle
  337.  
  338.                               ; Eintrag für unbekannte Fehlercodes korrigieren
  339.          mov MQueueUnknownErr,ax
  340.  
  341.          mov dx,ax            ; Fehlernummer nach DX
  342. l0:
  343.          lodsw
  344.          cmp ax,dx
  345.          lodsw
  346.          jne l0
  347.  
  348.          mov dx,ax            ; DX = Offset der Fehlermeldung
  349.          mov cx,[si+2]        ; CX = Offset der nächsten Fehlermeldung
  350.          sub cx,dx            ; CX = Länge der Fehlermeldung
  351.          stc
  352.          pop ax,ds,si
  353.          ret
  354.  
  355.